package service

import (
	"SkyPath/internal/infrastructure"
	"SkyPath/internal/infrastructure/gatewayimpl/dbtools"
	"fmt"
	"github.com/nguyenthenguyen/docx"
	"github.com/xuri/excelize/v2"
	"log"
	"math/rand"
	"time"
)

/*
具体业务代码实现
*/
type Dbtools struct{}

func (dbtool *Dbtools) GetDnAndGTMCount(module string, data int) int {
	dnCount := dbtool.getDNCount(module, data)
	gtmCount := dbtool.getGTMCount(module)
	// 入库
	var infras infrastructure.Infrastructure
	infs := infras.GetConn()
	dbtoolsDistribute := dbtools.Distribute{
		Dbtools: dbtools.Dbtools{
			ToolName:        "Distribute",
			ToolDescription: "计算分布式的dn节点和gtm节点需要的服务器数量",
			ToolCategory:    "0",
			ToolIcon:        "",
			ToolAuthor:      "Bai",
			ToolVersion:     "V1",
			ToolIsFeatured:  true,
			ToolViewCount:   0,
			ToolStatus:      "enable",
		},
		InputFieldsOfModel:    module,             // 一主一备
		InputFieldsOfDataSize: data,               // 数据量大小
		OutputFields:          dnCount + gtmCount, // 输出字段数
	}
	err := infs.Exec(&dbtoolsDistribute)
	if err != nil {

		log.Println(err)
	}
	err = infs.Close()
	if err != nil {
		log.Println(err)
		return 0
	}
	CreatePanWeiDBDeliverConfirmDoc()
	return dnCount + gtmCount
}

func (dbtool *Dbtools) getDNCount(module string, data int) int {
	if module == "0" {
		// 一主一备模式
		// dn节点数量
		masterDN := ((data / 5) * 2) / 2
		return masterDN
	} else if module == "1" {
		// 一主两备模式
		// 主dn节点数量
		masterDN := data / 5
		// 总dn节点数量
		dnNum := masterDN * 3
		backupDN := (dnNum - (masterDN * 2)) / 2
		return masterDN + backupDN
	}
	return 0
}

func (dbtool *Dbtools) getGTMCount(module string) int {
	if module == "0" || module == "1" {
		// 一主一备模式
		return 3
	}
	return 0
}

// 生成帐号管理平台的申请excel
func createAccountManagerFile() {
	accountExcel := "系统从帐号开户申请模板"
	// 打开已有文件
	f, err := excelize.OpenFile(accountExcel)
	if err != nil {
		fmt.Println("打开文件错误:", err)
		return
	}
	defer func() {
		if err := f.Close(); err != nil {
			fmt.Println("关闭文件错误:", err)
		}
	}()

	// 要覆盖的数据 - 可以是不同类型
	newData := []interface{}{
		"新值A",         // A3 归属资源池
		100,           // B3 设备IP
		true,          // C3 设备名称 非必填
		3.14,          // D3 数据库实例名 非必填
		"=SUM(B3:D3)", // E3 数据库类型
		100,           // 端口号
		1,             // 从帐号名
		1,             // 正好使用者工作指责
		1,             // 归属主账号
		2,             // 可访问具体资源/权限 非必填
		3,             // 主目录
		4,             // 口令管理方式
	}

	// 定义要覆盖的单元格
	cells := []string{"A3", "B3", "C3", "D3", "E3"}

	// 覆盖数据
	for i, cell := range cells {
		if err := f.SetCellValue("Sheet1", cell, newData[i]); err != nil {
			fmt.Printf("设置单元格 %s 失败: %v\n", cell, err)
			continue
		}
	}

	// 保存文件
	if err := f.Save(); err != nil {
		fmt.Println("保存文件错误:", err)
	} else {
		fmt.Println("数据追加成功!")
	}
}

func CreatePanWeiDBDeliverConfirmDoc() {

	// 读取模板文件
	r, err := docx.ReadDocxFile("磐维交付确认单_template.docx")
	if err != nil {
		fmt.Println("Error reading template file:", err)
		return
	}

	docx1 := r.Editable()

	// 准备替换数据
	data := prepareTemplateData()

	// 替换文档中的变量
	for key, value := range data {
		err := docx1.Replace(key, value, -1)
		if err != nil {
			return
		}
	}

	// 随机勾选复选框
	randomCheckBoxes(docx1)

	// 保存生成的文档
	outputFile := fmt.Sprintf("磐维交付确认单_%s.docx", time.Now().Format("20060102"))
	err = docx1.WriteToFile(outputFile)
	if err != nil {
		fmt.Println("Error saving document:", err)
		return
	}

	fmt.Printf("文档生成成功: %s\n", outputFile)
}

// 准备模板数据
func prepareTemplateData() map[string]string {
	rand.Seed(time.Now().UnixNano())

	return map[string]string{
		"{{Date}}":             time.Now().Format("2006年1月2日"),
		"{{Company}}":          "XX省公司/IT公司XX部门",
		"{{SystemName}}":       "XX系统",
		"{{DBVersion}}":        "磐维数据库 V2.0",
		"{{Deployment}}":       "一主一备\n共2套",
		"{{OriginalDB}}":       "Oracle",
		"{{WorkOrder}}":        "WO20230001",
		"{{DisasterRecovery}}": "双集群双中心",
		"{{HostInfo1}}":        "资源池A：10.1.1.1,10.1.1.2,10.1.1.3,10.1.1.4（VIP）",
		"{{HostInfo2}}":        "资源池B：10.2.1.1,10.2.1.2,10.2.1.3,10.2.1.4（VIP）",
		"{{LicenseCount}}":     "2",
		"{{LicenseExpiry}}":    "2025年12月31日",
		"{{BackupStrategy}}":   "每三天进行一次全备，保留3份",
		"{{ArchiveStrategy}}":  "保留3份完整的备份集，且保留3*3=9天，并清理十天前的归档",
		"{{SystemCount}}":      "2",
		"{{Reason}}":           "因资源限制不配置监控，双方达成一致",
		"{{SystemOwner}}":      "张三",
		"{{OwnerContact}}":     "13800138000",
		"{{ProjectManager}}":   "李四",
		"{{ManagerContact}}":   "13900139000",
	}
}

// 随机勾选复选框
func randomCheckBoxes(docx1 *docx.Docx) {
	rand.Seed(time.Now().UnixNano())

	// 定义所有可能的复选框及其替换值
	checkboxes := map[string]string{
		"⬜ 业务系统调研表":              "✓ 业务系统调研表",
		"⬜ 项目建设方案":               "✓ 项目建设方案",
		"⬜ 架构图":                  "✓ 架构图",
		"⬜ 应用兼容性评估（可选）":          "✓ 应用兼容性评估（可选）",
		"⬜ 数据库兼容性评估（可选）":         "✓ 数据库兼容性评估（可选）",
		"⬜ 数据迁移报告（可选）":           "✓ 数据迁移报告（可选）",
		"⬜ 数据一致性校验（可选）":          "✓ 数据一致性校验（可选）",
		"⬜ 性能调优手册":               "✓ 性能调优手册",
		"⬜ 授权导入，共X个":             "✓ 授权导入，共2个",
		"⬜ 到期时间：":                "✓ 到期时间：2025-12-31",
		"⬜ 基线扫描报告":               "✓ 基线扫描报告",
		"⬜ 备份恢复演练报告（可选）":         "✓ 基线扫描报告",
		"⬜ 高可用切换演练报告":            "✓ 高可用切换演练报告",
		"⬜ 巡检脚本":                 "✓ 巡检脚本",
		"⬜ 故障应急手册":               "✓ 故障应急手册",
		"⬜ 应急演练（可选）":             "✓ 应急演练（可选）",
		"⬜ 数据库定时任务（定时备份和归档清理任务）": "✓ 数据库定时任务（定时备份和归档清理任务）",
		"⬜ DBOPS":    "✓ DBOPS",
		"⬜ BOMC":     "✓ BOMC",
		"⬜ 磐基paas平台": "✓ 磐基paas平台",
		"⬜ 提供监控指标或者exporter安装部署": "✓ 提供监控指标或者exporter安装部署",
		"⬜ 口令变更":       "✓ 口令变更",
		"⬜ 账号变更（omm等）": "✓ 账号变更（omm等）",
	}

	// 执行替换
	for old, newBoxs := range checkboxes {
		err := docx1.Replace(old, newBoxs, -1)
		if err != nil {
			return
		}
	}
}

// 随机返回勾选或未勾选状态
func randomCheck() string {
	if rand.Intn(2) == 1 {
		return "✓"
	}
	return "⬜"
}

// 生成磐维交付确认单
//func CreatePanWeiDBDeliverConfirmDoc() {
//	doc := document.New()
//
//	// 设置文档属性
//	doc.CoreProperties.SetTitle("磐维数据库交付确认单")
//
//	// 添加标题
//	para := doc.AddParagraph()
//	run := para.AddRun()
//	run.AddText("磐维数据库交付确认单 " + time.Now().Format("2006年01月02日"))
//	run.Properties().SetSize(16)
//	run.Properties().SetBold(true)
//	run.Properties().SetColor(color.Red) // 标题设为红色
//
//	// 创建表格
//	table := doc.AddTable()
//	table.Properties().SetWidthPercent(100)
//
//	// 定义变量（红字部分）
//	vars := map[string]string{
//		"company":      "XX省公司/xx专业公司/IT公司XX部门",
//		"system":       "XX系统",
//		"db_version":   "磐维数据库 V2.0",
//		"deploy_type":  "一主一备\n共2套",
//		"old_db":       "Oracle",
//		"work_order":   "DB20230001",
//		"disaster":     "双集群双中心",
//		"host_info1":   "xx资源池：10.1.1.1,10.1.1.2,10.1.1.3,10.1.1.4（VIP）",
//		"host_info2":   "xx资源池：10.2.1.1,10.2.1.2,10.2.1.3,10.2.1.4（VIP）",
//		"license_num":  "4",
//		"license_date": "2025-12-31",
//		"backup_policy": "每三天进行一次全备，保留3份",
//		"archive_policy": "保留3份完整的备份集，且保留3*3=9天，并清理十天前的归档",
//		"reason":       "系统规模较小",
//		"db_count":     "2",
//		"unfinished":   "高可用切换演练",
//	}
//
//	// 第一行：公司/部门和系统名称
//	row := table.AddRow()
//	addMergedCell(row, "公司/部门", 1, 1, true)
//	addMergedCell(row, vars["company"], 7, 1, false)
//	addMergedCell(row, "系统名称", 2, 1, true)
//	addMergedCell(row, vars["system"], 1, 1, false)
//
//	// 第二行：数据库版本信息和部署形式
//	row = table.AddRow()
//	addMergedCell(row, "数据库版本信息", 1, 1, true)
//	addMergedCell(row, vars["db_version"], 2, 1, false)
//	addMergedCell(row, "部署形式", 1, 1, true)
//	addMergedCell(row, vars["deploy_type"], 4, 1, false)
//	addMergedCell(row, "原数据库", 2, 1, true)
//	addMergedCell(row, vars["old_db"], 1, 1, false)
//
//	// 第三行：工单号
//	row = table.AddRow()
//	addMergedCell(row, "工单号", 1, 1, true)
//	addMergedCell(row, vars["work_order"], 10, 1, false)
//
//	// 第四行：容灾需求
//	row = table.AddRow()
//	addMergedCell(row, "容灾需求", 1, 1, true)
//	addMergedCell(row, vars["disaster"], 10, 1, false)
//
//	// 第五、六行：主机信息
//	row = table.AddRow()
//	addMergedCell(row, "主机信息", 1, 2, true)
//	addMergedCell(row, vars["host_info1"], 10, 1, false)
//
//	row = table.AddRow()
//	addMergedCell(row, vars["host_info2"], 10, 1, false)
//
//	// 交付清单部分
//	// 架构设计
//	row = table.AddRow()
//	addMergedCell(row, "交付清单", 1, 12, true)
//	addMergedCell(row, "架构设计", 1, 1, true)
//	addCheckboxCell(row, "业务系统调研表", 4, true)  // 第一个勾选
//	addCheckboxCell(row, "项目建设方案", 3, true)
//	addCheckboxCell(row, "架构图", 2, true)
//
//	// 兼容评估
//	row = table.AddRow()
//	addMergedCell(row, "兼容评估", 1, 1, true)
//	addCheckboxCell(row, "应用兼容性评估（可选）", 5, true)
//	addCheckboxCell(row, "数据库兼容性评估（可选）", 4, true)
//
//	// 迁移改造
//	row = table.AddRow()
//	addMergedCell(row, "迁移改造", 1, 1, true)
//	addCheckboxCell(row, "数据迁移报告（可选）", 5, true)
//	addCheckboxCell(row, "数据一致性校验（可选）", 4, true)
//
//	// 性能优化
//	row = table.AddRow()
//	addMergedCell(row, "性能优化", 1, 1, true)
//	addCheckboxCell(row, "性能调优手册", 9, true)  // 第二个勾选
//
//	// license
//	row = table.AddRow()
//	addMergedCell(row, "license", 1, 1, true)
//	addCheckboxCell(row, "授权导入，共"+vars["license_num"]+"个", 5, true)  // 第三个勾选
//	addCheckboxCell(row, "到期时间："+vars["license_date"], 4, true)
//
//	// 安全加固
//	row = table.AddRow()
//	addMergedCell(row, "安全加固", 1, 1, true)
//	addCheckboxCell(row, "基线扫描报告", 9, true)
//
//	// 运维保障 - 备份恢复演练
//	row = table.AddRow()
//	addMergedCell(row, "运维保障", 1, 3, true)
//	addCheckboxCell(row, "备份恢复演练报告（可选）", 5, true)
//	addCheckboxCell(row, "高可用切换演练报告", 4, true)
//
//	// 运维保障 - 巡检脚本
//	row = table.AddRow()
//	addCheckboxCell(row, "巡检脚本", 5, true)  // 第四个勾选
//	addCheckboxCell(row, "故障应急手册", 4, true)
//
//	// 运维保障 - 应急演练
//	row = table.AddRow()
//	addCheckboxCell(row, "应急演练（可选）", 5, true)
//	addCheckboxCell(row, "数据库定时任务（定时备份和归档清理任务）", 4, true)  // 第五个勾选
//
//	// 监控告警
//	row = table.AddRow()
//	addMergedCell(row, "监控告警(任选一项)", 1, 3, true)
//	addCheckboxCell(row, "DBOPS", 4, true)
//	addCheckboxCell(row, "BOMC", 3, false)
//	addCheckboxCell(row, "磐基paas平台", 2, true)  // 第六个勾选
//
//	row = table.AddRow()
//	addCheckboxCell(row, "提供监控指标或者exporter安装部署", 9, true)
//
//	row = table.AddRow()
//	addCheckboxCell(row, "不使用监控请在备注处说明理由", 9, false)
//
//	// 默认参数修改
//	row = table.AddRow()
//	addMergedCell(row, "默认参数修改", 1, 2, true)
//	addMergedCell(row, "信息变更", 1, 1, true)
//	addCheckboxCell(row, "口令变更", 5, true)
//	addCheckboxCell(row, "账号变更（omm等）", 4, true)
//
//	row = table.AddRow()
//	addMergedCell(row, "其他说明", 1, 1, true)
//	addMergedCell(row, "", 9, 1, false)
//
//	// 备注
//	row = table.AddRow()
//	addMergedCell(row, "备注", 1, 1, true)
//	note := fmt.Sprintf(`1备份恢复演练报告协商业务迁移适配完成后，进行备份恢复演练后协助提供
//2 定时备份策略：%s
//3 备份归档清理策略：%s
//4 经双方验证，%s系统磐维数据库共%s套。因%s原因不配置监控，双方达成一致，%s项未完成，结束交付。`,
//		vars["backup_policy"], vars["archive_policy"], vars["system"], vars["db_count"], vars["reason"], vars["unfinished"])
//	addMergedCell(row, note, 10, 1, false)
//
//	// 签名行
//	row = table.AddRow()
//	sign := "系统负责人：\n联系方式："
//	addMergedCell(row, sign, 5, 1, false)
//	sign = "交付项目经理：\n联系方式："
//	addMergedCell(row, sign, 6, 1, false)
//
//	// 添加注释
//	para = doc.AddParagraph()
//	run = para.AddRun()
//	run.AddText("注：1.不涉及数据迁移的系统\"兼容评估\"和\"迁移改造\"两项可不选择。")
//
//	para = doc.AddParagraph()
//	run = para.AddRun()
//	run.AddText("2.兼容评估和迁移改造两项所涉及的报告由DTP迁移工具生成。")
//
//	para = doc.AddParagraph()
//	run = para.AddRun()
//	run.AddText("3.所有手册均由磐维团队提供，其他测试/演练报告请业务侧协助完成。")
//
//	para = doc.AddParagraph()
//	run = para.AddRun()
//	run.AddText("4. 可选项，如果业务需要，暂时无法提供的可以协商时间进行操作补充（需要补充协助工单），协商结果补充在备注中")
//
//	para = doc.AddParagraph()
//	run = para.AddRun()
//	run.AddText("5.数据库定时任务（定时备份和归档清理任务）需要在备注中写明具体策略.")
//
//	para = doc.AddParagraph()
//	run = para.AddRun()
//	run.AddText("6.性能调优手册:可参考磐维数据库V2.0管理员指南第10章节")
//
//	// 保存文档
//	err := doc.SaveToFile("磐维交付确认单.docx")
//	if err != nil {
//		fmt.Println("保存文件出错:", err)
//	} else {
//		fmt.Println("文档生成成功!")
//	}
//}
//
//// 添加合并单元格
//func addMergedCell(row document.Row, text string, colspan, rowspan int, center bool) {
//	cell := row.AddCell()
//	cell.Properties().SetColumnSpan(colspan)
//	//cell.Properties().SetColumnSpan(rowspan)
//	//cell.Properties().SetRowSpan(rowspan)
//
//	para := cell.AddParagraph()
//	run := para.AddRun()
//	run.AddText(text)
//
//	if center {
//		para.Properties().SetAlignment(wml.ST_JcCenter)
//	}
//}
//
//// 添加带复选框的单元格
//func addCheckboxCell(row document.Row, text string, colspan int, checked bool) {
//	cell := row.AddCell()
//	cell.Properties().SetColumnSpan(colspan)
//
//	para := cell.AddParagraph()
//	run := para.AddRun()
//
//	// 添加复选框符号
//	if checked {
//		run.AddText("✓ ") // 对勾符号
//	} else {
//		run.AddText("□ ") // 方框符号
//	}
//
//	run.AddText(text)
//}
